#ifndef ASTAR_H
#define ASTAR_H

#include <iostream>


#include <ctime>
#include <sys/time.h>

#include "TextManager.h"
#include "Affichage.h"
#include "position.h"
#include <map>
/*! \class AStar
*   \brief Classe implémentant l'algorithme du a* pour que l'ia trouve son chemin sur la carte
*/
class AStar
{

    public:
    /*! \struct noeud
    *   \brief Noeud pour l'astar contient le noeud parent le cout des déplacements g et le cout totalt avec l'heuristique
    */
    struct noeud{
        position p;
        int g;
        int f;
        position parent;

    };
        AStar(position depart,position fin,int  (&costmap)[NY][NX]);
        /*! \brief Algorithme du a* appelle les autres fonctions de la classe
        */
        void a_star();
        /*! \brief Choisi le meilleur noeud et le stocke dans la variables courant_ pour que les autres puisse l'utiliser
        */
        void meilleur_noeud();
        /*! \brief Ajoute les noeud accessible dans la liste ouverte open_
        */
        void ajout_case_adjacentes();
        /*! \brief Supprime le noeud courant de la liste ouverte et l'ajoute dans la liste ferme
        */
        void ajout_liste_ferme();
        /*! \brief Existe-t-il déjà un noeud a la position b dans le liste liste
        *   \return true si le noeud existe déjà
         *           false sinon
        */
        bool dansLaListe(position b,map<position,noeud> liste);
        /*! \brief Calcule la distance de manhattan (norme 1) entre le point a et b afin de l'utiliser comme heuristique
        *  \return Distance entre a et b en norme 1
        */
        static int distance(position a,position b);
        /*! \brief Retourne la prochaine action a prendre afin de suivre le chemin trouvé par l'a*
        *  \return position contient la prochaine position où il faut se déplacer
        */
        position nextDir();
        /*! \brief Retourne le chemin trouve par l'a*
        *   \return vector<position>  vector de position contennant les cases du chemin
        */
        vector<position> chemin();
    protected:
    private:
        map<position,noeud> open_; /*< Liste des noeuds ouverts utilisé par le a* pour trouver le chemin */
        map<position,noeud> closed_; /*< Liste des noeuds fermés utilisé par le a* pour trouver le chemin */
        noeud courant_; /*< Noeud courant exploré par le a* */
        bool chemin_;  /*< True si un chemin existe false sinon */
        int  (&costmap_)[NY][NX]; /*< Pointeur vers la map sur laquelle l'algorithme cherche le chemin */
        position depart_; /*< Position de depart */
        position fin_;  /*< Position d'arrivée */
};

#endif // ASTAR_H
